package com.yanxu.nio.c1;

import java.nio.Buffer;
import java.nio.ByteBuffer;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2024/12/22-2024
 * @Description: byteBuffer 读取相关的操作。 本质就是操作 position 的指针的过程。
 */
public class Test4_ByteBufferRead {
    public static void main(String[] args) {
        ByteBuffer byteBuffer1 = ByteBuffer.allocate(10);
        byteBuffer1.put(new byte[]{'a','b','c','d','e','f'});

        byteBuffer1.flip();
        byteBuffer1.get();  //读取一个字节
        byteBuffer1.get(new byte[4]);  //一次读取4个字节

        //已经读取了一部分了，但是当前的需求是：数据需要反复读  (rewind: 倒带)
        //从头开始读
        byteBuffer1.rewind();  //源码中就是 position = 0; 将指针设置为0
        byteBuffer1.get(); //此时，再读取就是从开始读了。

        //====================================================分割线====================================================

        //mark && reset
        //mark   记录一个 position 的位置
        //reset  将 position 重置到mark 的位置。
        ByteBuffer byteBuffer2 = ByteBuffer.allocate(10);
        byteBuffer2.put(new byte[]{'a','b','c','d','e','f'});

        byteBuffer2.get(); //读取一个字节。 读取完之后，指针向后移动，position=1
        byteBuffer2.get(); //再读取一个字节。 读取完之后，指针向后移动，position=2

        //添加标记。即：在 position=2 的位置添加了标记。
        byteBuffer2.mark();

        byteBuffer2.get(); //再读取一个字节
        byteBuffer2.get(); //再读取一个字节

        //重置，将 position 指针重置到上次的位置。此时就可以从这个位置继续往后读取了......
        byteBuffer2.reset();



        //====================================================分割线====================================================
        ByteBuffer byteBuffer3 = ByteBuffer.allocate(10);
        byteBuffer3.put(new byte[]{'a','b','c','d','e','f'});

        byteBuffer3.get();
        byteBuffer3.get();
        byteBuffer3.get(0);  //指定索引读取，不会改变 position 的指针
        byteBuffer3.get(3);  //指定索引读取，不会改变 position 的指针



    }
}